Да, реально. Для этого тебе понадобится сделать три вещи:
Создать улучшение на основе улучшения для Headhunter.
Создать способность на основе способности "Безумие" (именно она и изменяет Headhunter'а). Я имею в виду ту способность, в которой в данных нужно указать "тип войск".
Добавить обоим юнитам эту способность. Также посмотри, чтобы в параметре "взаимосвязь эквивалентов" у твоего "рыцаря" стоял "паладин".
Вроде Эльрат (или nikikin ли? Не помню) занимался конвертом моделей из homm5 в wc3. Попробуй договориться с ним, потому что из пятых героев крайне мало моделек переконвертировано. А из тех, что есть - мало нормальных, полноценно анимированных.
У анрайза вроде было, там был морф на мемхаке чисто без абилок, в его разделе должно быть. Найден ивент урона на предметы и разрушаемые обьекты.
Но без костыльно пока в паблике нету, портрет юнита хранится не в его структуре, нужно менять в бд данные о потртете или патчить прорисовку (что пока не сделал никто), так что тупо морфим да модель меняем.
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
doleo82, я бы тебе предложил переложить скилл на полностью триггерную основу, тогда можно будет регулировать урон в момент его нанесения, в зависимости от каких-либо условий...
Я посмотрел, но возникла проблема. Я тупой и не могу написать также, но моменте добаления юнита в хеш таблицу. Я Save Handle of (Last created unit) as 0 of (а дальше я не нашёл, как добавть "Key(Constructed structure))" in Hash
и соответсвенно любое другое действие, где прописанно Key
Так не нужно ничего самому делать. Я прикрепил к тому сообщению карту. В ней я уже все сделал сам. Тебе осталось только скопировать триггеры оттуда в свою карту и заменить юнитов на тех, которые тебе нужны. Вот та карта:
set Host = LoadUnitHandle(твой_хеш, GetHandleId(умерший_юнит), твоё_число)
set Dead = LoadInteger(твой_хеш, GetHandleId(Host), другое_твоё_число)
call SaveInteger(твой_хеш, GetHandleId(Host), другое_твоё_число, Dead + 1)
// Не забываем чистить хеш.
call FlushChildHashtable(твой_хеш, GetHandleId(умерший_юнит))
Через некоторое время создавай новых юнитов.
set Group = LoadGroupHandle(твой_хеш, GetHandleId(твоё_строение), твоё_число_2)
set Dead = LoadInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число)
if Dead > 0 then
call SaveInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число, 0)
loop
set Dead = Dead - 1
set Unit = CreateUnit(...)
call GroupAddUnit(Group, Unit)
call SaveUnitHandle(твой_хеш, GetHandleId(Unit), твоё_число, твоё_строение)
exitwhen Dead == 0
endloop
endif
да, массив постоянно будет делать reAllocMem , если текущий размер окажется мельче, чем номер ячейки. Поэтому, если массив будет часто писаться с инкрементом, то выгоднее сперва прописать в последнее допустимое значение (8191 для 26 патча) типа MyArray[8191]=0
чисто чтобы его по памяти не возили туда-сюда каждые X значений (не смотрел, сколько изначально выделяется)
я вот у себя пофиксил такую же байду с таблицей строк. игра выделяет по 16 ячеек под строки, а у меня в доте они генерируются десятками в секунду. Каждую секунду игра делала ре-аллок памяти, а к середине игры там уже несколько мб таблица туда-сюда ездила. Сделал аллок в разы больше - и таблица всего 2 раза переедет за 40 минут игры максимум. Экономия тактов налицо.
Хеш-таблицы вообще не являются массивами, гугл в помощь, поэтому там об этом думать не стоит. Стоит думать лучше о том, чтобы первичных (родительских) ключей было меньше, чем вторичных, чисто исходя из того, что в этом случае перебор по таблице окажется быстрее
отменять постройку юнита если технология уже ап
либо как сразу говорили через ап здания
где каждому твоему зданию будет соответствовать такое же здание но с дополнительным слотом
с продажей юнита открываешь доту и смотришь как там сделан спелл передать предметы у куры
он сделан как раз через продажу юнита
иначе никак
если не нравится пожалуйся богу об этом
или близардам
пусть выпустят новый патч специально для тебя
Как бы вообще не понял сути вопроса, но судя по этому комментарию, не получается удалить в РО карты синий объект из кампании. Это нормально, удалять надо в РО редактора кампании.
можно задать постоянную музыку при входе юнита в область.
А выключать её по событию "юнит покидает область".
Они же рядом события эти, чего усложнятьв сё.
Ну так в условия строительства - только лагерь 2(доп лагерь).
И можно ещё поставить при условии, что есть больше 1 ратуши (т.е. 2 лагерь 100% построен).
Мой бот единовременно владеет только 1 рудником. 2 ратуши это решение только для первого экспа, у меня на карте много рудников по небольшому количеству золота, комп должен возле каждого из них обустраивать оборону из вышек.
Только что проверил выставил строить у рудника №2 при условии что есть 2 ратуши, и он гад все равно стоит на главной базе,где рудник уже закончился.
Хм... То есть ты делал башни компу, поставил им место только во 2 лагере... Или у 2 рудника. И только при условии что у него есть 2 ратуши или заняты 2 рудника? Хм... Если он их строит, то он понимает что есть 2 рудника/ратуши, но не понимает где именно 2 рудник находится.
всё как сказал Borodach
чтобы такой фигни не было надо запускать таймер на 0 секунд и им восстанавливать здоровье
также при получении урона надо давать скил на +100500 хп а таймером этот скил убирать и устанавливать нужное количество хп
подобных вопросов было дофига и готовых решений как следствие тоже дофига
я вроде тоже как то кидал свою систему обнуления урона
у меня тут дело в том что герои и так моментально ресаются, но отнимается жизни и они улетают на точку реса, а если сработает крест или реинкарнация юнит никуда не улетает а просто ждёт свой таймер и ресается...А что я собственно говоря туплю, у меня же смерти все триггерные как никак, просто в общем событии не отнимать жизнь если прокнул шанс, и не переносить на стартовую локу, а просто реснуть с задержкой. Спасибо за наводку парни 8gabriel8, pro100master, PT153, Absolute, KingMaximax, ssbbssc, , я понял, что мне нужно сделать
local DamageTrigger = CreateTrigger()
for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
TriggerRegisterPlayerUnitEvent(DamageTrigger, Player(i), EVENT_PLAYER_UNIT_DAMAGING) -- до вычета брони
TriggerRegisterPlayerUnitEvent(DamageTrigger, Player(i), EVENT_PLAYER_UNIT_DAMAGED) -- после вычета брони
end
TriggerAddAction(DamageTrigger, function()
local damage = GetEventDamage() -- число урона
local damageType = BlzGetEventDamageType() -- тип урона
local target = GetTriggerUnit() -- тот кто получил урон
local caster = GetEventDamageSource() -- тот кто нанёс урон
end)
Еще раз, 'Aams' - щит от магии, он дает маг имун и только. 'Aam2' - нейтрализует урон от магии, при этом в цель можно применять заклинания, обрати внимание там другой бафф.
Активация либо канал, либо любой скил без цели, и дамми каст щита молний на этого героя.
Может быть получится с руной щита молний, но не факт, надо проверять
Кажется я понял в чем дело. В общем, в карте монолит в импорте файлик LoadingScreen.mdx весит 3 кб, когда я его экспортирую на рабочий стол, а затем импортирую обратно в карту с рабочего стола, то он почему-то начинает весить не 3, а 1 кб, а Лоадскрин не показывается при загрузке карты. Но из-за чего это происходит я не знаю.
8gabriel8, Я полагал, что чёрные - юниты/объекты внутри, а красные - юниты/объекты вокруг, вот собственно его задача была расстановка юнитов/объектов вокруг, но ты прав, нужно больше информации.
Поинт - позиция юнита
Группа - создать группу
Выбрать всех юнитов вокруг героя, добавить в Группу
Инт - количество юнитов в Группе
От 1 до Инт
Цикл:
-Установить Таргет = рандом юнит из группы
-Создать Дамми в Поинт
-Приказать последнему созданному замедление(Альянс) на Таргет
-Добавить таймер последнему созданному 0.50
-Убрать Таргет из Группы
-Установить Таргет = нет б.е.
Очистить Группу
Удалить Поинт
call DestroyGroup(udg_Group)
set udg_Group = null
set udg_Point = null
Рад, что ты предложил выход, но я, боюсь, твой код себе никак не перенесу, ибо, как писал в вопросе, лишь на GUI могу работать. 8gabriel8,
мне кажется, проблема не в этом триггере, а в другом, который запускает триггеры и таймеры.
Триггер, запускающий таймер, вряд ли многое испортить может
Мдаааа... Я свою ошибку таки нашёл. Она была в самом тупом месте из всех возможных.
Я действительно не понимаю, это у меня голова не работает совершенно, или в редакторе какие-то баги
Цитата из вопроса, у меня не работает голова.
Так вот, это я дурак полный.
Запихнул обнуление своей переменной ВНИМАНИЕ! в триггер, который игрокам-компьютерам каждые 2 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную. Обнаружил ли я это через дебаги? Нет, просто от скуки и безнадёжности положения начал прокручивать и листать все триггеры.
Спасибо всем, кто пытался помочь, это было очень приятно) Мне жаль, что вы ломали голову и тратили время впустую по моей глупости и невнимательности.
Вджасс это дополнение к обычному джассу, у себя ты можешь видеть строки объявления библиотеки, продвинутые комментарии и статические константные переменные
function Trig_CW_Cast_Actions takes nothing returns nothing
local unit u = LoadUnitHandle( какая_нибудь_хештаблица, GetHandleId(GetExpiredTimer()), 0 )
local real x1 = GetUnitX( u ) //координаты кастера
local real y1 = GetUnitY( u )
local real from = 800
local real a = GetUnitFacing( u ) //угол поворота юнита
//local real S = 90 //Ширина угла
//local real angle = S/2 //Половина ширины угла
set udg_Angle = a
set udg_Caster = u
//set udg_X = angle
call BJDebugMsg("Угол поворота при касте: "+ R2S(a))
call GroupEnumUnitsInRange(bj_lastCreatedGroup,x1,y1,from, Condition(function TZZ))
//call ForGroup( bj_lastCreatedGroup, function TZZ )
call GroupClear(bj_lastCreatedGroup)
set u = null
endfunction
function TimerOff takes nothing returns nothing
local timer t = GetExpiredTimer()
local timer t2 = LoadTimerHandle( какая_нибудь_хештаблица, GetHandleId(t), 0 )
call FlushChildHashtable( какая_нибудь_хештаблица, GetHandleId(t) )
call FlushChildHashtable( какая_нибудь_хештаблица, GetHandleId(t2) )
call DestroyTimer( t )
call DestroyTimer( t2 )
set t = null
set t2 = null
endfunction
function Timer takes nothing returns nothing
local timer t = CreateTimer()
local timer t2 = CreateTimer()
local unit u = GetTriggerUnit()
call SaveUnitHandle( какая_нибудь_хештаблица, GetHandleId( t ), 0, u )
call TimerStart( t, /*Периодичность*/0.04, true, Trig_CW_Cast_Actions )
call SaveTimerHandle( какая_нибудь_хештаблица, GetHandleId(t2), 0, t )
call TimerStart( t2, /*Время которое будет работать таймер*/36, false, TimerOff )
set t = null
set t2 = null
set u = null
endfunction
//===========================================================================
function InitTrig_Cast takes nothing returns nothing
set gg_trg_Cast = CreateTrigger( )
set bj_lastCreatedGroup = CreateGroup()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Cast, Condition( function Trig_CW_Cast_Conditions ) )
call TriggerAddAction( gg_trg_Cast, function Timer )
endfunction
Неразрушаемые декорации очень геморройны, особенно отсутствие многих триггеров в разделе animation. Уж лучше браться за изменение через РО/макс. угол поворота или же макс. угол крена, а затем скрыть декорацию и показать только в нужное для игрока, время
Равно в варике округляет, а вот неравно - нет. У тебя и выводит 90.000, потому что R2S округляет до 3-го знака, а на самом деле там было что-то вроде 89.999999. 90 != 89.999999 в варике, потому условие прошло. Хочешь, чтобы не прошло, используй not (90 == angle). Тогда 89.999999 округлится до 90 и условие не пройдёт.
Либо используй то, что показал Скорп, тоже подойдёт.
Создаешь 2 модельки, у одной анимация стрельбы, у другой удара штыком. За тем создаешь 2 юнитов с разными модельками и при смене режима (на базе любого метамарфоза) меняешь юнита.
Все анимации атаки вписанные в юнита будут задействованы рандомно, даже если прикажешь триггером использовать конкретную анимку. Дабы избежать этого, нужно использовать лишь одну анимацию атаки.
do
local f = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
f() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger()
end
end
function InitMyTrigger()
local SpellTrigger = CreateTrigger()
for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
local player = Player(i)
TriggerRegisterPlayerUnitEvent(SpellTrigger, player, EVENT_PLAYER_UNIT_SPELL_CAST)
end
TriggerAddAction(SpellTrigger, function()
local eventId = GetHandleId(GetTriggerEventId())
local caster = GetTriggerUnit()
local casterX, casterY = GetUnitX(caster), GetUnitY(caster)
local spellId = GetSpellAbilityId()
-- local spellX, spellY = GetSpellTargetX(), GetSpellTargetY()
if spellId == FourCC('A000') then -- Призыв
print("призыв")
local newu = CreateUnit(GetOwningPlayer(caster), FourCC('h000'), casterX, casterY, GetUnitFacing(caster))
end
end)
end
RobertStevenson, вейты вообще зло, а отсчёт можно сделать таймером. Точнее и без неожиданных багов.
Ждать пока - это вейт в цикле, работает это просто отвратно, сам с этим сталкивался. Лучше заменить на событие смерти колдуна.
Я всё же думаю, что дело не в вейтах. Выводи имя героя Hero[A]. Лучше выводить так: ("герой - ") + (Имя юнита (Hero[A])) + " " + (Число в строку (А)).
Если нет имени - героя просто нет в этой переменной.
Наименее ресурсозатратным для игрового процесса будет кастовать саму волну через отдельного дамми, который создаётся специально и только для волны силы. Сама волна наносит 1 ед урона. И потом определив, тип юнит-источника урона - наносим нужный урон от лица героя-хозяина юнита "волна силы".
В варианте "чекать группы каждые 0.0х сек" будет засоряться память и скорее всего будут подлагивания, в варианте со спец-дамиками засорится РО, выбирай из двух зол.
Astra, очень багано
так как после последней атаки может многое изменится
так же урон при событие юнит получает урон зависит от брони и прочих резистов
если юнит с уроном 100 нанёс удар по врагу с физ резистом 50% а потом получил бафф/предмет на +100 урона то скилом нанесёт 50 урона хотя должен был бы нанести 200
тут нужно юзать бд
при касте скила брать из бд начальный урон юнита, бонусы предметов и бонусы всех бафов
тема кстати уже много раз поднималась
и каждый раз все заканчивалось тем что афтар забивал на подобную систему либо писал "вы все нубы/тролли и не знаете/не хотите сказать как сделать это легко и просто"
ибо подобная система требует кучи кода и как минимум 30 прочтённых статей по jass
вот статья о бд
Yonsen, обычно юзают предметную способность "запас здоровья" до 999999к хп. Обычно на все случаи жизни, любимый метод. Даем ее в момент нанесения урона. Когда срабатывает событие "юнит получает", то в этот момент урон еще не произошел, нам как бы оповешают, что он будет через 0.00 сек. Получает пассивку и через 0.00 сек урон. Потом хилим. И удаляем способность. Все.
А еще лучше можно жаровню илидана заюзать для сжигания маны и срабатывания событий, которые вызываются при включении и выключении этой горелки. Причем она еще и сама автоматически выключится, когда закончится мана.
Есть функция проверки кол-ва ловкости героя, при этом можно посмотреть сколько ловкости от характеристик и сколько от предметов, исходя из кол-ва ловкости вручать предметные абилки на атаку.
Самое простое - апгрейды, триггерно повышать уровень улучшения которое будет действовать на героя, увы это не идеальный вариант, но один из самых просты. Так же вручать способности предметов на регенерацию здоровья \ маны.
Напрямую - никак, есть место только под 5 способностей. Делать свою систему прокачки способностей из спеллбука или какие либо еще способы, на подобии рпгшных карт.
» WarCraft 3 / Рыцари
» WarCraft 3 / Смена контроля юнитов
» WarCraft 3 / Эффекты
» WarCraft 3 / Порталы и Юнит
» WarCraft 3 / Душа Демона 2 (v1.2)
» WarCraft 3 / Условие способность применяется на определеного типа юнита
» WarCraft 3 / Горючая смесь
» WarCraft 3 / Хеш таблица
» WarCraft 3 / Апгрейд одного юнита до другого
» WarCraft 3 / Syntax Error
» WarCraft 3 / Музыкальный список
» WarCraft 3 / Своя фоновая музыка
» WarCraft 3 / Редактор ИИ и доп. рудник
» WarCraft 3 / Изменение графики на SD
» WarCraft 3 / Отлавливать урон.
» WarCraft 3 / Щит молний.
» WarCraft 3 / черные квадраты
» WarCraft 3 / нерабочий триггер
» WarCraft 3 / Нужно определить угол
» WarCraft 3 / Модель
» WarCraft 3 / Анимация атаки.
» WarCraft 3 / Как работают триггеры?
» WarCraft 3 / Триггерный урон от способности
» WarCraft 3 / Инком от маны